/*
 * @(#)ButtonEvent.java
 *
 * Copyright 2002 - 2003 JIDE Software Inc. All rights reserved.
 */
package com.element.ui.dialog;

import java.awt.*;
import java.util.EventObject;

/**
 * An EventObject used to change the state of any button.
 */
public class ButtonEvent extends EventObject {
	/**
	 * The first number in the range of IDs used for <code>ButtonEvent</code>.
	 */
	public static final int BUTTON_EVENT_FIRST = AWTEvent.RESERVED_ID_MAX + 1300;

	/**
	 * The last number in the range of IDs used for <code>DockableFrame</code> events.
	 */
	public static final int BUTTON_EVENT_LAST = BUTTON_EVENT_FIRST + 9;

	/**
	 * This event is fired when you want to show the button.
	 */
	public static final int SHOW_BUTTON = BUTTON_EVENT_FIRST;

	/**
	 * This event is fired when you want to hide the button.
	 */
	public static final int HIDE_BUTTON = 1 + BUTTON_EVENT_FIRST;

	/**
	 * This event is fired when you want to enable the button.
	 */
	public static final int ENABLE_BUTTON = 2 + BUTTON_EVENT_FIRST;

	/**
	 * This event is fired when you want to disable the button.
	 */
	public static final int DISABLE_BUTTON = 3 + BUTTON_EVENT_FIRST;

	/**
	 * This event is fired when you want to change the text of the button.
	 */
	public static final int CHANGE_BUTTON_TEXT = 4 + BUTTON_EVENT_FIRST;

	/**
	 * This event is fired when you want to change the mnemonic of the button.
	 */
	public static final int CHANGE_BUTTON_MNEMONIC = 5 + BUTTON_EVENT_FIRST;

	/**
	 * This event is fired when you want to change the tooltip of the button.
	 */
	public static final int CHANGE_BUTTON_TOOLTIP = 6 + BUTTON_EVENT_FIRST;

	/**
	 * This event is fired when you want to set focus to the button.
	 */
	public static final int CHANGE_BUTTON_FOCUS = 7 + BUTTON_EVENT_FIRST;

	/**
	 * This event is fired when you want to set the button to the default button in a root pane.
	 */
	public static final int SET_DEFAULT_BUTTON = 8 + BUTTON_EVENT_FIRST;

	/**
	 * This event is fired when you want to clear the default button from a root pane.
	 */
	public static final int CLEAR_DEFAULT_BUTTON = 9 + BUTTON_EVENT_FIRST;

	private int _id;

	private String _buttonName;

	private String _userObject;

	/**
	 * Creates a ButtonEvent with source, id and the button name.
	 *
	 * @param source
	 * @param id
	 * @param buttonName
	 */
	public ButtonEvent(Object source, int id, String buttonName) {
		super(source);
		_id = id;
		_buttonName = buttonName;
		checkParam();
	}

	/**
	 * Creates a ButtonEvent with source, id, the button name and a user object. User object is required for
	 * CHANGE_BUTTON_TEXT and CHANGE_BUTTON_TOOLTIP event.
	 *
	 * @param source
	 * @param id
	 * @param buttonName
	 * @param userObject
	 */
	public ButtonEvent(Object source, int id, String buttonName, String userObject) {
		super(source);
		_id = id;
		_buttonName = buttonName;
		_userObject = userObject;
		checkParam();
	}

	private void checkParam() {
		if (getID() < BUTTON_EVENT_FIRST && getID() > BUTTON_EVENT_LAST) {
			throw new IllegalArgumentException(getID() + " is an invalid event id for ButtonEvent");
		}
		if (_buttonName == null || _buttonName.trim().length() == 0) {
			throw new IllegalArgumentException("buttonName cannot be null or empty");
		}
		if ((_userObject == null || _userObject.trim().length() == 0)
				&& (getID() == CHANGE_BUTTON_TEXT
				|| getID() == CHANGE_BUTTON_MNEMONIC
				|| getID() == CHANGE_BUTTON_TOOLTIP)) {
			throw new IllegalArgumentException("userObject cannot be null or empty for " + paramString());
		}
	}

	/**
	 * Returns the event id.
	 *
	 * @return event id.
	 */
	public int getID() {
		return _id;
	}

	/**
	 * Sets the event id.
	 *
	 * @param id
	 */
	public void setID(int id) {
		_id = id;
	}

	/**
	 * Gets the button name of this event object.
	 *
	 * @return the button name.
	 */
	public String getButtonName() {
		return _buttonName;
	}

	/**
	 * Sets the button name.
	 *
	 * @param buttonName
	 */
	public void setButtonName(String buttonName) {
		_buttonName = buttonName;
	}

	/**
	 * Gets the user object of this event object.
	 *
	 * @return the user object.
	 */
	public String getUserObject() {
		return _userObject;
	}

	/**
	 * Sets the user object.
	 *
	 * @param userObject
	 */
	public void setUserObject(String userObject) {
		_userObject = userObject;
	}

	/**
	 * Returns a parameter string identifying this event. This method is useful for event logging and for debugging.
	 *
	 * @return a string identifying the event and its attributes
	 */
	public String paramString() {
		return switch (getID()) {
			case SHOW_BUTTON -> "SHOW_BUTTON";
			case HIDE_BUTTON -> "HIDE_BUTTON";
			case ENABLE_BUTTON -> "ENABLE_BUTTON";
			case DISABLE_BUTTON -> "DISABLE_BUTTON";
			case CHANGE_BUTTON_TEXT -> "CHANGE_BUTTON_TEXT";
			case CHANGE_BUTTON_MNEMONIC -> "CHANGE_BUTTON_MNEMONIC";
			case CHANGE_BUTTON_TOOLTIP -> "CHANGE_BUTTON_TOOLTIP";
			case CHANGE_BUTTON_FOCUS -> "CHANGE_BUTTON_FOCUS";
			case SET_DEFAULT_BUTTON -> "SET_DEFAULT_BUTTON";
			default -> "BUTTON_EVENT_UNKNOWN";
		};
	}
}
